home *** CD-ROM | disk | FTP | other *** search
- /*
- ** Project dialog example
- ** Module Dlog.c
- ** Author Bernie Wieser ©1991
- ** Date 10/26/91
- **
- ** Purpose
- ** An example program showing how to handle default keyboard
- ** input, correct update re-drawing of the dialog, and input
- ** filtering.
- ** This code is for educational purpose only. Any use thereof
- ** requires appropriate credit.
- **
- ** Bugs
- ** No support for keyboard te facilities.
- */
- #include "Dlog.h"
- #include "common.h"
-
- static pascal Boolean filter(
- DialogPtr dp,
- EventRecord *er,
- short *itemHit
- )
- {
- Byte c;
- Boolean status;
- short err;
-
- status = FALSE;
-
- SetPort(dp);
- if(er->what == updateEvt) {
- /*
- ** don't call beginUpdate and endUpdate,
- ** since this will mess up DrawDialog
- */
- err = DefaultButton(dp, BOKAY);
- }
- if(er->what == keyDown) {
- c = er->message & charCodeMask;
- /*
- ** Is it a command key?
- */
- if(er->modifiers & cmdKey) switch(c) {
- /* Cancel cmd-. */
- case '.':
- *itemHit = BCANCEL;
- status = TRUE;
- err = PressButton(dp, BCANCEL, 6L);
- break;
- /* Save cmd-s */
- case 's':
- case 'S':
- *itemHit = BSAVE;
- status = TRUE;
- err = PressButton(dp, BSAVE, 6L);
- break;
- default:
- break;
- }
- else switch(c) {
- /*
- ** Edit keys
- */
- case 0x8:
- case 0x9:
- case 0x1c:
- case 0x1d:
- case 0x1e:
- case 0x1f:
- break;
- /*
- ** Default key, return
- */
- case 0xD:
- *itemHit = BOKAY;
- status = TRUE;
- err = PressButton(dp, BOKAY, 6L);
- break;
- /*
- ** Escape key, cancel
- */
- case 0x1b:
- *itemHit = BCANCEL;
- status = TRUE;
- err = PressButton(dp, BCANCEL, 6L);
- break;
- /*
- ** Other keys are context specific
- */
- default:
- switch(((DialogPeek)dp)->editField+1) {
- case ETEXTFLD:
- if(!isletter(c)) {
- /* not a letter? eat it */
- *itemHit = 0;
- status = TRUE;
- }
- break;
- case ENUMFLD:
- if(!isnumber(c)) {
- /* not a number? eat it */
- *itemHit = 0;
- status = TRUE;
- }
- break;
- default:
- break;
- }
- break;
- }
- }
- return(status);
- }
-
- void GetDHandle(
- DialogPtr dp,
- short item,
- Handle *handy
- )
- {
- Rect box;
- short type;
-
- GetDItem(dp, item, &type, handy, &box);
- }
-
- void DialogTest(
- short dlogid
- )
- {
- DialogRecord dr;
- DialogPtr dp;
- short x,
- err;
- pMyData pmd;
- short item;
- Boolean done;
-
- /*
- ** Set up the dialog
- */
- dp = GetNewDialog(dlogid, &dr, (WindowPtr)-1);
- if(err = ResError())
- DebugStr("\pGetNewDialog failed");
-
- /*
- ** Set up a record of important item handles for
- ** easy reference by all routines i.e. setup, filters, etc.
- ** Dangle it of the dlog's window's refCon, since this
- ** data will always be available to every routine!
- ** (Not used in this example.)
- */
- pmd = (pMyData)NewPtr((long)sizeof(myData));
- if(err = MemError())
- DebugStr("\ppmd NewPtr failed");
- for(x=0; x<END; x++) {
- GetDHandle(dp, x+1, &pmd->harray[x]);
- }
- ((DialogPeek)dp)->window.refCon = (long)pmd;
-
- /*
- ** Handle the dialog
- */
- done = FALSE;
- while(!done){
- ModalDialog(filter, &item);
- switch(item) {
- /*
- ** Handle the Buttons
- */
- case BOKAY: /* done, don't save */
- done = TRUE;
- break;
- case BCANCEL:
- done = TRUE;
- break;
- case BSAVE: /* save default */
- done = TRUE;
- break;
- /*
- ** Handle mouse downs in text field! Isn't
- ** too useful, so nothing is done here.
- */
- case ETEXTFLD:
- break;
- case ENUMFLD:
- break;
- default:
- break;
- }
- }
- DisposPtr(pmd);
- CloseDialog(dp);
- }